/**********************************************************************

  Audacity: A Digital Audio Editor

  LangChoice.cpp

  Dominic Mazzoni

*******************************************************************//*!

\class LangChoiceDialog
\brief A dialog used (at start up) to present the user with a choice
of languages for Audacity.

*//*******************************************************************/
#include "LangChoice.h"
#include "IteratorX.h"

#include <wx/defs.h>
#include <wx/choice.h>
#include <wx/stattext.h>

#include "Languages.h"
#include "ShuttleGui.h"
#include "AudacityMessageBox.h"
#include "wxPanelWrapper.h"

class LangChoiceDialog final : public wxDialogWrapper
{
public:
    LangChoiceDialog(wxWindow* parent, wxWindowID id, const TranslatableString& title);

    wxString GetLang() { return mLang; }

private:
    void OnOk(wxCommandEvent& event);

    wxChoice* mChoice;
    wxString mLang;

    int mNumLangs;
    wxArrayString mLangCodes;
    TranslatableStrings mLangNames;

    DECLARE_EVENT_TABLE()
};

wxString ChooseLanguage(wxWindow* parent)
{
    wxString returnVal;

    /* i18n-hint: Title on a dialog indicating that this is the first
     * time Audacity has been run. */
    LangChoiceDialog dlog(parent, -1, XO("Audacity First Run"));
    dlog.CentreOnParent();
    dlog.ShowModal();
    returnVal = dlog.GetLang();

    return returnVal;
}

BEGIN_EVENT_TABLE(LangChoiceDialog, wxDialogWrapper)
EVT_BUTTON(wxID_OK, LangChoiceDialog::OnOk)
END_EVENT_TABLE()

LangChoiceDialog::LangChoiceDialog(wxWindow* parent,
                                   wxWindowID id,
                                   const TranslatableString& title)
    : wxDialogWrapper(parent, id, title)
{
    SetName();
    const auto& paths = FileNames::AudacityPathList();
    Languages::GetLanguages(paths, mLangCodes, mLangNames);
    int lang = make_iterator_range(mLangCodes)
               .index(Languages::GetSystemLanguageCode(paths));

    ShuttleGui S(this, eIsCreating);

    S.StartVerticalLay(false);
    {
        S.StartHorizontalLay();
        {
            S.SetBorder(15);
            mChoice = S.AddChoice(XXO("Choose Language for Audacity to use:"),
                                  mLangNames,
                                  lang);
        }
        S.EndVerticalLay();

        S.SetBorder(0);
        S.AddStandardButtons(eOkButton);
    }
    S.EndVerticalLay();

    Fit();
}

void LangChoiceDialog::OnOk(wxCommandEvent& WXUNUSED(event))
{
    int ndx = mChoice->GetSelection();
    mLang = mLangCodes[ndx];

    auto slang
        =Languages::GetSystemLanguageCode(FileNames::AudacityPathList());
    int sndx = make_iterator_range(mLangCodes).index(slang);
    wxString sname;

    if (sndx == wxNOT_FOUND) {
        const wxLanguageInfo* sinfo = wxLocale::FindLanguageInfo(slang);
        if (sinfo) {
            sname = sinfo->Description;
        }
    } else {
        sname = mLangNames[sndx].Translation();
    }

    if (mLang.Left(2) != slang.Left(2)) {
        /* i18n-hint: The %s's are replaced by translated and untranslated
         * versions of language names. */
        auto msg = XO("The language you have chosen, %s (%s), is not the same as the system language, %s (%s).")
                   .Format(mLangNames[ndx],
                           mLang,
                           sname,
                           slang);
        if (wxNO == AudacityMessageBox(msg, XO("Confirm"), wxYES_NO)) {
            return;
        }
    }

    EndModal(true);
}
